//在ie中服务端返回应该是text/html，否则如果是application/json则会直接弹出下载
jQuery.extend({

    createUploadIframe: function(id, uri)
    {
        //create frame
        var frameId = 'jUploadFrame' + id;
        var io ;
        try{        	 
        	 io = document.createElement('<iframe id="' + frameId + '" name="' + frameId + '" />');	//IE9不支持        	
        	 
             if(typeof uri== 'boolean'){
                 io.src = 'javascript:false';
             }
             else if(typeof uri== 'string'){
                 io.src = uri;
             } 
             if(window.ActiveXObject) {             	
        	   if(jQuery.browser.version=="9.0" || jQuery.browser.version=="10.0"){  
        	        io = document.createElement('iframe');  
        	        io.id = frameId;  
        	        io.name = frameId;
        	    }else if(jQuery.browser.version=="6.0" || jQuery.browser.version=="7.0" || jQuery.browser.version=="8.0"){  
        	        io = document.createElement('<iframe id="' + frameId + '" name="' + frameId + '" />');  
        	        if(typeof uri== 'boolean'){  
        	            io.src = 'javascript:false';  
        	        }  
        	        else if(typeof uri== 'string'){  
        	            io.src = uri;  
        	        }  
        	    }  
        	} 
        }
        catch(e)
        {
            io = document.createElement('iframe');
            io.id = frameId;
            io.name = frameId;            
        }
        io.style.position = 'absolute';
        io.style.top = '-1000px';
        io.style.left = '-1000px';

        document.body.appendChild(io);
        return io;
    },
    createUploadForm: function(id, fileElementId)
    {
        //create form
        var formId = 'jUploadForm' + id;
        var fileId = 'jUploadFile' + id;
        var form = $('<form  action="" method="POST" name="' + formId + '" id="' + formId + '" enctype="multipart/form-data"></form>');
        var oldElement = $('#' + fileElementId);
        var newElement = $(oldElement).clone();
        $(oldElement).attr('id', fileId);
        $(oldElement).before(newElement);
        $(oldElement).appendTo(form);
        //set attributes
        $(form).css('position', 'absolute');
        $(form).css('top', '-1200px');
        $(form).css('left', '-1200px');
        $(form).appendTo('body');
        return form;
    },
    addOtherRequestsToForm: function(form,data)
    {
        // add extra parameter
        var originalElement = $('<input type="hidden" name="" value="">');
        for (var key in data) {
            name = key;
            value = data[key];
            var cloneElement = originalElement.clone();
            cloneElement.attr({'name':name,'value':value});
            $(cloneElement).appendTo(form);
        }
        return form;
    },

    ajaxFileUpload: function(s) {
    	
        // TODO introduce global settings, allowing the client to modify them for all requests, not only timeout
        s = jQuery.extend({}, jQuery.ajaxSettings, s);
        var id = new Date().getTime();
        var form = jQuery.createUploadForm(id, s.fileElementId);
        if ( s.data ) form = jQuery.addOtherRequestsToForm(form,s.data);
        var io = jQuery.createUploadIframe(id, s.secureuri);
        var frameId = 'jUploadFrame' + id;
        var formId = 'jUploadForm' + id;
        // Watch for a new set of requests
        if ( s.global && ! jQuery.active++ )
        {
            jQuery.event.trigger( "ajaxStart" );
        }
       
        var requestDone = false;
        // Create the request object
        var xml = {};
        
        if ( s.global )
            jQuery.event.trigger("ajaxSend", [xml, s]);
        
        // Wait for a response to come back
        var uploadCallback = function(isTimeout)
        {
            var io = document.getElementById(frameId);
            try
            {
                if(io.contentWindow)
                {
                    xml.responseText = io.contentWindow.document.body?io.contentWindow.document.body.innerHTML:null;
                    xml.responseXML = io.contentWindow.document.XMLDocument?io.contentWindow.document.XMLDocument:io.contentWindow.document;

                }else if(io.contentDocument)
                {
                    xml.responseText = io.contentDocument.document.body?io.contentDocument.document.body.innerHTML:null;
                    xml.responseXML = io.contentDocument.document.XMLDocument?io.contentDocument.document.XMLDocument:io.contentDocument.document;
                }               
            }catch(e)
            {
                jQuery.handleError(s, xml, null, e);
            }
            if ( xml || isTimeout == "timeout")
            {
                requestDone = true;
                var status;
                try {
                    status = isTimeout != "timeout" ? "success" : "error";
                    // Make sure that the request was successful or notmodified
                    if ( status != "error" )
                    {
                        // process the data (runs the xml through httpData regardless of callback)
                        var data = jQuery.uploadHttpData( xml, s.dataType );
                        // If a local callback was specified, fire it and pass it the data
                    	if ( s.success )
                            s.success( data, status );
                        // Fire the global callback
                        if( s.global )
                            jQuery.event.trigger( "ajaxSuccess", [xml, s] );
                    } else
                        jQuery.handleError(s, xml, status);
                } catch(e)
                {
                    status = "error";
                    //!!!Error
                    jQuery.handleError(s, xml, status, e);
                }

                // The request was completed
                if( s.global )
                    jQuery.event.trigger( "ajaxComplete", [xml, s] );

                // Handle the global AJAX counter
                if ( s.global && ! --jQuery.active )
                    jQuery.event.trigger( "ajaxStop" );

                // Process result
                if ( s.complete )
                    s.complete(xml, status);

                jQuery(io).unbind();

                setTimeout(function()
                {	try
                    {
                        $(form).remove();

                    } catch(e)
                    {
                        jQuery.handleError(s, xml, null, e);
                    }

                }, 100);

                xml = null;

            }
        };
      
        // Timeout checker
        if ( s.timeout > 0 )
        {
            setTimeout(function(){
                // Check to see if the request is still happening
                if( !requestDone ) uploadCallback( "timeout" );
            }, s.timeout);
        }
        
        //try
        //{
            // var io = $('#' + frameId);        	
            var form = $('#' + formId);           
            $(form).attr('action', s.url);
            $(form).attr('method', 'POST');
            $(form).attr('target', frameId);
            $(form).attr('encoding', "multipart/form-data");
            
            /*
            alert($(form).ajaxSubmit)
            var options = {
            		url : s.url,
            		success : function(data) {
            			alert(data);        			
            		}//,resetForm : true
            	};
           $(form).ajaxSubmit(options);
          */
           /* if(form.encoding)
            {
                form.encoding = 'multipart/form-data';
            }
            else
            {
                form.enctype = 'multipart/form-data';
            }*/
            
            //alert(s.url)
            $(form).submit();
           
       /* } catch(e)
        {
            jQuery.handleError(s, xml, null, e);
        }*/
        if(window.attachEvent){
            document.getElementById(frameId).attachEvent('onload', uploadCallback);
        }
        else{
            document.getElementById(frameId).addEventListener('load', uploadCallback, false);
        }
        return {abort: function () {}};

    },

    uploadHttpData: function( r, type ) {
        var data = !type;
        data = type == "xml" || data ? r.responseXML : r.responseText;
        // If the type is "script", eval it in global context       
        if ( type == "script" )
            jQuery.globalEval( data );
        // Get the JavaScript object, if JSON is used.
        if ( type == "json" )
        {
            //data = jQuery.parseJSON(jQuery(data).text());
            // If you add mimetype in your response,
            // you have to delete the '<pre></pre>' tag.
            // The pre tag in Chrome has attribute, so have to use regex to remove
            var data = r.responseText;
            //var rx = new RegExp("<pre.*?>(.*?)</pre>","i");
            //var am = rx.exec(data);
            //this is the desired data extracted
            //var data = (am) ? am[1] : "";    //the only submatch or empty
            //data = data;
            eval( "data = " + data );
        }
        // evaluate scripts within html
        if ( type == "html" )
            jQuery("<div>").html(data).evalScripts();
        //alert($('param', data).each(function(){alert($(this).attr('value'));}));
        return data;
    },
    handleError: function( s, xhr, status, e )	{
    	// If a local callback was specified, fire it
		if ( s.error ) {
			s.error.call( s.context || s, xhr, status, e );
		}
	
		// Fire the global callback
		if ( s.global ) {
			(s.context ? jQuery(s.context) : jQuery.event).trigger( "ajaxError", [xhr, s, e] );
		}
    },
    Upload:function(uploadId,id,readOnly,amount){	
		obj=$("#"+uploadId+id);
		if(obj.val()=="") return;		
		jQuery.ajaxFileUpload({
		    url: "../Main/Upload.data",
		    data: {t:new Date().getTime()},
		    dataType:"json",
		    secureuri: false,
		    fileElementId:uploadId+id,		   
		    success: function(data,status ) {		   
		    	if(!data) return;
		  		if(data.code=="0000")
		    	{		        	
		        	var value=$("#"+id).val();
		        	if(value=="")
		        		$("#"+id).val(data.data);
		        	else
		        		$("#"+id).val(value+","+data.data);			        	       	
		        	jQuery.UploadShowFile(uploadId,id,readOnly,amount);
				}
				else
					alert(data.message);	          	       		   
		    },
            error: function (data, status, e)
            {
                 alert("上传异常"+e.message);
            }		    
		});
	},
	//上传显示
    UploadShowFile:function(uploadId,id,readOnly,amount)
	{	
		var value=$("#"+id).val();
		var html="";
		var isAmountOver=false;
		if(value!="")
		{
			var files=value.split(",");
            isAmountOver=(files.length>=amount);
			if(!readOnly&&!isAmountOver) html="<br>";//HDS20171115 非只读且有文件上传
			for(var i=0;i<files.length;i++)
			{
				var fileName = files[i].split('|');		
				html+="<span class='uploadList'><a target=_blank href='"+fileName[1]+"'>"+fileName[0]+"</a>";
				if(!readOnly) html+=" <a class='uploadDel' onclick=\"$.UploadDel('"+uploadId+"','"+id+"',"+readOnly+","+amount+",'"+fileName[1]+"','"+files[i]+"')\">删除</a></span>";
			}
		}	
		if(isAmountOver)
		{
			$("#"+uploadId+"_btn").hide();
			$("#"+uploadId+id).hide();
		}else
		{
			$("#"+uploadId+"_btn").show();
			$("#"+uploadId+id).show();
		}
		$("#"+uploadId+id+"_list").html(html);		
	},
	//上传删除
	UploadDel:function(uploadId,id,readOnly,amount,file,fileValue)
	{
		$.ajax({
			type: 'POST',
		    url: "../Main/UploadDel.data",
		    data:{file:file},
		    dataType: "json",
		    success: function( data ) {
		    	if(data.code=="0000")
		    	{
		    		var obj=$("#"+id);	    		
		    		var value=obj.val().replace(fileValue,"").replace(",,",",")	;   		
		    		if(value!=""&&value.substring(0,1)==",") value=value.substring(1);	 
		    		if(value!=""&&value.substring(value.length-1,value.length)==",") value=value.substring(0,value.length-1);   	
		    		obj.val(value);
		    		jQuery.UploadShowFile(uploadId,id,readOnly,amount);
		    	}
		    }
		});
	},
	UploadInit:function(uploadId,id,readOnly,amount)
	{
		var html="";
		if(!readOnly)
		{
			html+="<a onclick=\"$('#"+uploadId+id+"').click();\" id='"+uploadId+"_btn' class='uploadBtn'>添加附件</a>";
			html+="<input type='file' name='uploadfile' id='"+uploadId+id+"' onchange=\"$.Upload('"+uploadId+"','"+id+"',"+readOnly+","+amount+")\"/>";
		}
		html+="<div id='"+uploadId+id+"_list'></div>";
		$("#"+uploadId).html(html);
		jQuery.UploadShowFile(uploadId,id,readOnly,amount);
	}
});

